#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>

// void* thread_run(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     //std::string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<" name: "<<name<<std::endl;
//     }
//    return nullptr;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid,nullptr,thread_run,(void*)"thread-1");

//     while(true)
//     {
//         std::cout<<"我是主线程"<<std::endl;
//         sleep(1);
//     }

//     pthread_join(tid,nullptr);
//     return 0;
// }

// void* thread_run(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     //std::string name = (const char*)args;
//     while(true)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<" name: "<<name<<" pid: "<<getpid()<<std::endl;
//     }
//    return nullptr;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid,nullptr,thread_run,(void*)"thread-1");

//     while(true)
//     {
//         std::cout<<"我是主线程 pid :"<<getpid()<<std::endl;
//         sleep(1);
//     }

//     pthread_join(tid,nullptr);
//     return 0;
// }

// // 让新线程5秒后发生错误
// void *thread_run(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     // std::string name = (const char*)args;
//     int cnt = 5;
//     while (cnt--)
//     {
//         sleep(1);
//         std::cout << "我是新线程" << " name: " << name << " pid: " << getpid() << std::endl;
//     }
//     int a = 10;
//     a /= 0;
//     return nullptr;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_run, (void *)"thread-1");

//     while (true)
//     {
//         std::cout << "我是主线程 pid :" << getpid() << std::endl;
//         sleep(1);
//     }

//     pthread_join(tid, nullptr);
//     return 0;
// }

// void* rontine(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     //std::string name = (const char*)args;
//     int cnt = 5;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<" name: "<<name<<std::endl;
//     }

//     return nullptr;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid,nullptr,rontine,(void*)"thread-1");

//     pthread_join(tid,nullptr);
//     return 0;
// }

// void showid(pthread_t& tid)
// {
//     //printf("tid = 0x%lx\n",tid);
//     printf("tid = %ld\n",tid);
// }

// std::string FormatId(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }
// void* rontine(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     //std::string name = (const char*)args;
//     int cnt = 5;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<" name: "<<name<<" tid = "<<FormatId(pthread_self())<<std::endl;
//     }

//     return nullptr;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid,nullptr,rontine,(void*)"thread-1");
//     showid(tid);
//     pthread_join(tid,nullptr);
//     return 0;
// }

// //测试返回值
// void showid(pthread_t& tid)
// {
//     printf("tid = 0x%lx\n",tid);
// }

// std::string FormatId(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }
// void* rontine(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     //std::string name = (const char*)args;
//     int cnt = 5;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout<<"我是新线程"<<" name: "<<name<<" tid = "<<FormatId(pthread_self())<<std::endl;
//     }

//     return (void*)100;
// }

// int main()
// {

//     pthread_t tid;
//     pthread_create(&tid,nullptr,rontine,(void*)"thread-1");
//     showid(tid);
//     //接收返回值
//     void* ret = nullptr;
//     pthread_join(tid,&ret);

//     std::cout<<"ret = "<<(long long)ret<<std::endl;
//     return 0;
// }

// 测试创建线程传参可以传任意类型

// class Task
// {
// public:
//     Task(int a, int b)
//         : _a(a), _b(b)
//     {
//     }
//     int Excute()
//     {
//         return _a + _b;
//     }

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int ret) : _ret(ret)
//     {
//     }
//     int GetRet()
//     {
//         return _ret;
//     }

// private:
//     int _ret;
// };

// void *routine(void *args)
// {
//     Task *t = static_cast<Task *>(args);

//     //std::cout << t->Excute() << std::endl;
//     Result r(t->Excute());
//     int ret =  r.GetRet();
//     return (void*)ret;
// }

// int main()
// {
//     Task *task = new Task(1, 2);
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, task);

//     void* ret = nullptr;
//     pthread_join(tid,&ret);
//     std::cout<<(long long)ret<<std::endl;
//     return 0;
// }

// void* routine(void* args)
// {
//     //新线程执行五秒主动退出
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout<<"我是新线程："<<cnt<<std::endl;
//         sleep(1);
//     }
//     //线程退出
//     std::cout<<"新线程主动退出"<<std::endl;
//     pthread_exit((void*)100);
//     std::cout<<"新线程不应该看到这里"<<std::endl;

//     return nullptr;
// }


// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,routine,nullptr);

//     //接收返回值
//     void* ret = nullptr;
//     int n = pthread_join(tid,&ret);
//     if(n == 0)
//         std::cout<<"join success"<<std::endl;
//     else
//         std::cout<<"join fail"<<std::endl;

//     std::cout<<"ret = "<<(long long)ret<<std::endl;

//     return 0;
// }



// void* routine(void* args)
// {
//     //新线程死循环，主线程5秒后取消新线程
//     while(true)
//     {
//         std::cout<<"我是新线程"<<std::endl;
//         sleep(1);
//     }

//     return (void*)666;
// }


// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,routine,nullptr);

//     //5秒后取消新线程
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout<<"我是主线程"<<std::endl;
//         sleep(1);
//     }
//     pthread_cancel(tid);
//     std::cout<<"新线程被取消"<<std::endl;

//     //接收返回值
//     void* ret = nullptr;
//     int n = pthread_join(tid,&ret);
//     if(n == 0)
//         std::cout<<"join success"<<std::endl;
//     else
//         std::cout<<"join fail"<<std::endl;

//     std::cout<<"ret = "<<(long long)ret<<std::endl;

//     return 0;
// }

// #include <cstring>

// void* routine(void* args)
// {

//     while(true)
//     {
//         std::cout<<"我是新线程"<<std::endl;
//         sleep(1);
//     }

//     return (void*)666;
// }


// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,routine,nullptr);
//     sleep(5);
//     分离新线程
//     std::cout<<"分离新线程"<<std::endl;
//     pthread_detach(tid);

//     接收返回值
//     void* ret = nullptr;
//     int n = pthread_join(tid,&ret);
//     if(n == 0)
//         std::cout<<"join success"<<std::endl;
//     else
//         std::cout<<"join fail"<<std::endl;

//     return 0;
// }

// #include <cstring>

// void* routine(void* args)
// {
//     //新线程主动分离
//     std::cout<<"我是新线程,主动分离"<<std::endl;
//     pthread_detach(pthread_self());
//     int cnt = 3;
//     while(cnt--)
//     {
//         std::cout<<"我是新线程"<<std::endl;
//         sleep(1);
//     }

//     return (void*)666;
// }


// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,routine,nullptr);
//     sleep(5);
//     //接收返回值
//     void* ret = nullptr;
//     int n = pthread_join(tid,&ret);
//     if(n == 0)
//     {
//         std::cout<<"join success"<<std::endl;
//         std::cout<<"ret = "<<(long long)ret<<std::endl;
//     }
//     else
//         std::cout<<"join fail"<<std::endl;

//     return 0;
// }

#include <vector>
//创建多线程

void* routine(void*args)
{
    sleep(1);
    std::string name = static_cast<const char*>(args);
    delete (char*)args;
    int cnt = 5;
    while(cnt--)
    {
        std::cout<<"我是新线程："<<name<<std::endl;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    std::vector<pthread_t> threads;
    for(int i = 0; i < 10;i++)
    {
        //创建线程
        pthread_t tid;
        //char name[64];//bug
        char* name = new char[64];
        snprintf(name,64,"pthread-%d",i);
        int n = pthread_create(&tid,nullptr,routine,(void*)name);
        if(n == 0)
            threads.emplace_back(tid);
        //sleep(1);
    }

    //一个一个等待
    for(auto x:threads)
    {
        int n = pthread_join(x,nullptr);
        if(n == 0)
            std::cout<<"join success"<<std::endl;
        else
            std::cout<<"join fail"<<std::endl;
    }

    return 0;
}